# 数据库连接
import config
import json
import logging

logging.basicConfig(filename='error.log', level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s')


def transform(unit_name, text):
    print(text)
    # 将JSON字符串解析为Python对象
    json_object = json.loads(text)
    ob = json_object["data"]["dataList"]
    # 提取linkMan和phone字段
    # 假设ob是一个包含字典的列表，每个字典都有"linkMan"和"phone"键
    # 首先对列表进行排序，以确保联系人不为空字符串的字典排在前面
    sorted_ob = sorted(ob, key=lambda x: x['linkMan'] == "")
    # 然后使用切片获取前6个元素
    extracted_data = [{"联系人": item["linkMan"], "电话": item["phone"]} for item in sorted_ob[:6]]

    data = {
        "单位名称": unit_name,
        "联系人和电话": extracted_data
    }
    return json.dumps(data, ensure_ascii=False, indent=4)

    # print(text)


def replace_str(json_str):
    # 去除多余的'''字符和将多行字符串转换为单行字符串
    json_str = json_str.replace("```", '').replace('\n', '').replace(' ', '').replace("json", "")

    # 尝试解析JSON字符串
    try:
        # 使用json.loads()函数解析JSON字符串
        parsed_json = json.loads(json_str)
        return json.dumps(parsed_json, ensure_ascii=False, indent=4)
    except json.JSONDecodeError as e:
        print(f"Error parsing JSON: {e}")


def remove_blank_lines(text):
    lines = text.split('\n')
    non_blank_lines = [line for line in lines if line.strip() != '']
    return '\n'.join(non_blank_lines)


def read_by_glm3turbo(page_text: object) -> str:
    from zhipuai import ZhipuAI
    import time
    client = ZhipuAI(api_key="9437fabb27c28a7b438fc30de753e2e0.R01Dwo5tBzFMiUVm")
    composite_prompt = """
    根据以下信息，回答以下问题：
    {page_text}
    提取以下字段
    标题、
    招标地-省（输出省全称，如湖北=湖北省）、
    招标地-市（输出市全称，如北京=北京市）、
    招标地-区（如果不存在输出为""）、
    所属行业（从项目名称进行判断对行业进行归类，匹配相近的行业分类如市政、公路、水运、水利、铁路、城轨、航空、建工、环境、食品，如果都匹配不上归类为其他）、
    招标类型、
    采购品目、
    项目正文、
    预采日期（间格式转换为yyyy-mm-dd。智能补全如：2016-05=2016-05-01）、
    发布时间（间格式转换为yyyy-mm-dd。智能补全如：2016-05=2016-05-01）、
    招标编号、
    采购概况（从上述文本中总结）
    招标单位、
    采购方式、
    招标单位联系人(人名和电话用|隔开)、
    招标代理机构、
    招标代理机构联系人(人名和电话用|隔开)、
    中标单位、
    中标单位联系人（输出电话号码即可）、
    报名截止时间（间格式转换为yyyy-mm-dd。智能补全如：2016-05=2016-05-01）、
    投标截止时间（间格式转换为yyyy-mm-dd。智能补全如：2016-05=2016-05-01）、
    招标估价、
    中标金额、
    评审专家.
    (用JSON格式返回回答内容，其中json的key必须是上面提到的字段信息不允许输出上面未提到的字段信息)
    """.format(page_text=page_text)
    start_time = time.time()
    response = object
    try:
        response = client.chat.completions.create(
            model="glm-3-turbo",  # 填写需要调用的模型名称
            temperature=0.5,
            max_tokens=8192,
            messages=[
                {"role": "system",
                 "content": "你是一个文本解析高手，你的任务是为用户提供高效快速的文本解析服务。并以json格式返回解析内容"},
                {"role": "user", "content": remove_blank_lines(composite_prompt)},
            ],
            stream=False,
        )
    except Exception as e:
        # 捕获异常
        logging.error(f'模型返回时发生异常: {e}')

    end_time = time.time()
    invoke_time = end_time - start_time
    print("耗时：" + str(invoke_time) + "秒")
    return response.choices[0].message.content


def read_cg_excel(file_path):
    global owner_org_tel
    from opr_mysql_database import MySQLDatabase
    from openpyxl import load_workbook
    db = MySQLDatabase(config.db_server)
    db.connect()

    wb = load_workbook(
        filename=file_path)
    # 加载现有的Excel文件
    sheet_names = wb.sheetnames
    # 从第二张工作表开始遍历
    for sheet_name in sheet_names[1:]:  # 从索引1开始，跳过第一张工作表
        ws = wb[sheet_name]  # 选择当前工作表
        cell_value = []  # 获取整个sheet页内容
        # owner_org_tel = ws['B40'].value
        for row in ws.iter_rows( values_only=True):
            if row[0] == "RAW":
                owner_org_tel = row[1]
                continue
            row_content = []
            for cell in row:
                if cell is not None:
                    row_content.append(str(cell))
            cell_value.append(row_content)

        item = ""
        try:
            db_row = read_by_glm3turbo(cell_value)
            content = cell_value
            print(db_row)
            json_obj = json.loads(replace_str(db_row))
            item = json_obj["标题"]
            print(json_obj["标题"])
            if "招标地-区" in json_obj:
                district = json_obj["招标地-区"]
            else:
                district = ""
            data = {
                'project_name': json_obj['标题'],
                'company': json_obj['招标单位'],
                'area': json_obj['招标地-省'],
                'city': json_obj['招标地-市'],
                'district': district,
                'procurement_method': json_obj['采购方式'],
                'budget': json_obj['招标估价'],
                'item_code': json_obj['招标编号'],
                'caigou_items': json_obj['采购品目'],
                'caigou_scanner': json_obj['采购概况'],
                'industry': json_obj['所属行业'],
                'item_introduce': json_obj['项目正文'],
                'biding_agency': json_obj['招标代理机构'],
                'declaration_date': None if json_obj['发布时间'] == "" else json_obj['发布时间'],
                'contact_info': json_obj['招标代理机构联系人'],
                'tel_info': json_obj['招标单位联系人'],
                'caigou_time': None if json_obj['预采日期'] == "" else json_obj['预采日期'],
                'application_deadline_time': None if json_obj['报名截止时间'] == "" else json_obj['报名截止时间'],
                'bid_deadline_time': None if json_obj['投标截止时间'] == "" else json_obj['投标截止时间'],
                'owner_org_tel': str(transform(json_obj['招标单位'], owner_org_tel)),
                'source_type': 2,
                'bidding_org': json_obj['中标单位'],
                'bidding_tel': json_obj['中标单位联系人'],
                'bid_amount': json_obj['中标金额'],
                'content': str(content),
                'tenant_id': 1,
                'assessment_experts': json_obj['评审专家'],
            }
            db.insert('bid_source_data', data)
            print(data)
        except Exception as e:
            # 捕获异常
            logging.error(f'处理采购- {item} 时发生异常: {e}')
            # 继续执行循环
            continue

    wb.close()

    db.close()


if __name__ == '__main__':
    read_cg_excel("")
